summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/jni/native.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app/src/main/jni/native.cpp')
-rw-r--r--src/android/app/src/main/jni/native.cpp117
1 files changed, 107 insertions, 10 deletions
diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp
index e5d3158c8..0c1db7d46 100644
--- a/src/android/app/src/main/jni/native.cpp
+++ b/src/android/app/src/main/jni/native.cpp
@@ -14,6 +14,7 @@
#include <android/api-level.h>
#include <android/native_window_jni.h>
#include <common/fs/fs.h>
+#include <core/file_sys/patch_manager.h>
#include <core/file_sys/savedata_factory.h>
#include <core/loader/nro.h>
#include <jni.h>
@@ -79,6 +80,10 @@ Core::System& EmulationSession::System() {
return m_system;
}
+FileSys::ManualContentProvider* EmulationSession::GetContentProvider() {
+ return m_manual_provider.get();
+}
+
const EmuWindow_Android& EmulationSession::Window() const {
return *m_window;
}
@@ -455,6 +460,15 @@ void EmulationSession::OnEmulationStopped(Core::SystemResultStatus result) {
static_cast<jint>(result));
}
+u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
+ auto program_id_string = GetJString(env, jprogramId);
+ try {
+ return std::stoull(program_id_string);
+ } catch (...) {
+ return 0;
+ }
+}
+
static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
MicroProfileOnThreadCreate("EmuThread");
SCOPE_EXIT({ MicroProfileShutdown(); });
@@ -504,6 +518,27 @@ int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject
GetJString(env, j_file_extension));
}
+jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj,
+ jstring jprogramId,
+ jstring jupdatePath) {
+ u64 program_id = EmulationSession::GetProgramId(env, jprogramId);
+ std::string updatePath = GetJString(env, jupdatePath);
+ std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
+ EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(updatePath,
+ FileSys::Mode::Read));
+ for (const auto& item : nsp->GetNCAs()) {
+ for (const auto& nca_details : item.second) {
+ if (nca_details.second->GetName().ends_with(".cnmt.nca")) {
+ auto update_id = nca_details.second->GetTitleId() & ~0xFFFULL;
+ if (update_id == program_id) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* env, jclass clazz,
jstring hook_lib_dir,
jstring custom_driver_dir,
@@ -665,13 +700,6 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass
EmulationSession::GetInstance().InitializeSystem(reload);
}
-jint Java_org_yuzu_yuzu_1emu_NativeLibrary_defaultCPUCore(JNIEnv* env, jclass clazz) {
- return {};
-}
-
-void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2Ljava_lang_String_2Z(
- JNIEnv* env, jclass clazz, jstring j_file, jstring j_savestate, jboolean j_delete_savestate) {}
-
jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) {
jdoubleArray j_stats = env->NewDoubleArray(4);
@@ -696,9 +724,13 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass
return ToJString(env, "JIT");
}
-void Java_org_yuzu_yuzu_1emu_utils_DirectoryInitialization_setSysDirectory(JNIEnv* env,
- jclass clazz,
- jstring j_path) {}
+void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
+ EmulationSession::GetInstance().System().ApplySettings();
+}
+
+void Java_org_yuzu_yuzu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj) {
+ Settings::LogSettings();
+}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2(JNIEnv* env, jclass clazz,
jstring j_path) {
@@ -792,4 +824,69 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env,
return true;
}
+jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAddonsForFile(JNIEnv* env, jobject jobj,
+ jstring jpath,
+ jstring jprogramId) {
+ const auto path = GetJString(env, jpath);
+ const auto vFile =
+ Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path);
+ if (vFile == nullptr) {
+ return nullptr;
+ }
+
+ auto& system = EmulationSession::GetInstance().System();
+ auto program_id = EmulationSession::GetProgramId(env, jprogramId);
+ const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),
+ system.GetContentProvider()};
+ const auto loader = Loader::GetLoader(system, vFile);
+
+ FileSys::VirtualFile update_raw;
+ loader->ReadUpdateRaw(update_raw);
+
+ auto addons = pm.GetPatchVersionNames(update_raw);
+ auto jemptyString = ToJString(env, "");
+ auto jemptyStringPair = env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
+ jemptyString, jemptyString);
+ jobjectArray jaddonsArray =
+ env->NewObjectArray(addons.size(), IDCache::GetPairClass(), jemptyStringPair);
+ int i = 0;
+ for (const auto& addon : addons) {
+ jobject jaddon = env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
+ ToJString(env, addon.first), ToJString(env, addon.second));
+ env->SetObjectArrayElement(jaddonsArray, i, jaddon);
+ ++i;
+ }
+ return jaddonsArray;
+}
+
+jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj,
+ jstring jprogramId) {
+ auto program_id = EmulationSession::GetProgramId(env, jprogramId);
+
+ auto& system = EmulationSession::GetInstance().System();
+
+ Service::Account::ProfileManager manager;
+ // TODO: Pass in a selected user once we get the relevant UI working
+ const auto user_id = manager.GetUser(static_cast<std::size_t>(0));
+ ASSERT(user_id);
+
+ const auto nandDir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
+ auto vfsNandDir = system.GetFilesystem()->OpenDirectory(Common::FS::PathToUTF8String(nandDir),
+ FileSys::Mode::Read);
+
+ const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath(
+ system, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData,
+ program_id, user_id->AsU128(), 0);
+ return ToJString(env, user_save_data_path);
+}
+
+void Java_org_yuzu_yuzu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj,
+ jstring jpath) {
+ EmulationSession::GetInstance().ConfigureFilesystemProvider(GetJString(env, jpath));
+}
+
+void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) {
+ EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries();
+}
+
} // extern "C"